﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//	int a = 10;
//	printf("%d\n", a);
//	int* pa = &a;
//	*pa = 0;
//	printf("%d", a);
//	return 0;
//}


//int main()
//{
//	printf("%d\n",sizeof(int*));
//	printf("%d\n",sizeof(short*));
//	printf("%d\n",sizeof(long*));
//	printf("%d\n",sizeof(char*));
//
//	return 0;
//}



//int main()
//{
//	int n = 0x11223344;
//	int* pi = &n;
//	*pi = 0;
//	return 0;
//}



//int main()
//{
//	int n = 0x11223344;
//	char* pc = (char*)&n;
//	*pc = 0;
//	return 0;
//}


//int main()
//{
//	int n = 10;
//	char* pc = (char*)&n;
//	int* pi = &n;
//
//	printf("%p\n", &n);
//	printf("%p\n", pc);
//	printf("%p\n", pc + 1);
//	printf("%p\n", pi);
//	printf("%p\n", pi + 1);
//	return 0;
//}

//int main()
//{
//	const int a = 10;
//	a = 5;
//	return 0;
//}

//int main()
//{
//	const int a = 10;
//	printf("%d\n", a);
//	int* pa = &a;
//	*pa = 5;
//	printf("%d ", a);
//	return 0;
//}


//void test1()
//{
//	int n = 10;
//	int m = 20;
//	int* p = &n;
//	*p = 20;//ok?
//	p = &m; //ok?
//}
//void test2()
//{
//	//代码2
//	int n = 10;
//	int m = 20;
//	const int* p = &n;
//	*p = 20;//ok?
//	p = &m; //ok?
//}
//void test3()
//{
//	int n = 10;
//	int m = 20;
//	int* const p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//void test4()
//{
//	int n = 10;
//	int m = 20;
//	int const* const p = &n;
//	*p = 20; //ok?
//	p = &m; //ok?
//}
//int main()
//{
//	//测试⽆const修饰的情况
//	test1();
//	//测试const放在*的左边情况
//	test2();
//	//测试const放在*的右边情况
//	test3();
//	//测试*的左右两边都有const
//	test4();
//	return 0;
//}



//int my_strlen(char* s)
//{
//	char* p = s;
//	while (*p != '\0')
//		p++;
//	return p - s;
//}
//int main()
//{
//	printf("%d\n", my_strlen("abc"));
//	return 0;
//}

//#include <assert.h>
//int main()
//{
//	int* p = NULL;
//	assert(p != NULL);
//	return 0;
//}



//void Swap1(int x, int y)
//{
//	int tmp = x;
//	x = y;
//	y = tmp;
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	printf("交换前：a=%d b=%d\n", a, b);
//	Swap1(a, b);
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
//}


//void Swap2(int*px, int*py)
//{
// int tmp = 0;
// tmp = *px;
// *px = *py;
// *py = tmp;
//}
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// printf("交换前：a=%d b=%d\n", a, b);
// Swap2(&a, &b);
// printf("交换后：a=%d b=%d\n", a, b);
// return 0;
//}

//int add(int x, int y)
//{
//	return x | y;
//}
//
//int main()
//{
//	printf("%d", add(111, 899));
//	return 0;
//
//}


#include <stdlib.h>

int compare(const void* a, const void* b)
{
    return (*(int*)a - *(int*)b);
}
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {
    qsort(nums, numsSize, sizeof(int), compare);
    int* ret = malloc(sizeof(int) * numsSize);
    int j = 0;
    for (int i = 1; i < numsSize; i++)
    {
        if (nums[i] - nums[i - 1] != 1 && nums[i] != nums[i - 1])
        {
            int k = nums[i - 1];
            while (k + 1 != nums[i])
            {
                ret[j] = k + 1;
                k++;
                j++;
            }
        }
    }
    if (numsSize - nums[numsSize - 1] > 1)
    {
        int a = nums[numsSize - 1];
        while (numsSize - a != 0)
        {
            ret[j] = a + 1;
            j++;
            a++;
        }
    }
    if (nums[numsSize - 1] != numsSize && numsSize - nums[numsSize - 1] == 1)
    {
        ret[j] = numsSize;
        j++;
    }
    if (nums[0] != 1)
    {
        ret[j] = 1;
        j++;
    }
    *returnSize = j;
    return ret;
}

int main()
{
    /*int* ret = malloc(sizeof(int) * 8);
    for (int i = 0; i < 8; i++)
    {
        ret[i] = i;
    }
    for (int i = 0; i < 8; i++)
    {
        printf("%d ", ret[i]);
    }*/
    int nums[4] = {1,1,2,2};
    int *ret=findDisappearedNumbers(nums, 4, 2);
    for (int i = 0; i < 1; i++)
    {
        printf("%d ", ret[i]);
    }
	return 0;
}

























